package com.tlias.tliaswebmanagement.controller;

import com.tlias.tliaswebmanagement.common.Result;
import com.tlias.po.Dept;
import com.tlias.tliaswebmanagement.service.DeptService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 部门控制器
 */
@RestController
@RequiredArgsConstructor
@RequestMapping("/depts")
public class DeptController {

    /**
     * 依赖注入部门业务逻辑层对象到当前类中，方便后续使用
     * SpringBoot官方不推荐@Autowired注解，而是推荐使用@RequiredArgsConstructor注解
     */
    private final DeptService deptService;


    /**
     * 1. 查询部门列表
     * 根据接口文档可知，是GET请求，需要使用@GetMapping注解处理，并补全路径 "/depts"
     * 根据接口文档可知，返回的是统一响应结果Result，并且结果封装的是Dept部门对象集合
     */
    @GetMapping
    public Result<List<Dept>> list() {
        //1.1 调用部门业务逻辑层，获取部门列表数据
        List<Dept> deptList = deptService.list();

        //1.2 将部门列表数据，封装到Result统一响应结果对象中返回
        return Result.success(deptList);
    }

    /**
     * 2. 根据ID删除部门
     * 根据接口文档可知，请求是DELETE类型，使用@DeleteMapping注解处理，并补全路径 "/depts"
     */
    @DeleteMapping
    public Result delete(Integer id) {
        //2.1 利用部门业务逻辑层对象deptService，传入id，让其执行删除部门的逻辑代码
        deptService.deleteById(id);
        //2.2 返回一个默认的成功结果
        return Result.success();
    }
    /**
     * 3. 新增部门
     * 根据接口文档可知，需要使用@PostMapping注解处理，并补全路径 "/depts"
     */
    @PostMapping
    public Result add(@RequestBody DeptDTO dto) {
        //3.1 Controller只有3个职责：1.处理请求并接收参数；2.调用业务逻辑层完成逻辑；3.返回结果给前端
        //调用业务逻辑层deptService对象，传入部门数据，去完成逻辑
        deptService.addOne(dto);

        //3.2 返回一个默认的成功结果即可
        return Result.success();
    }
    /**
     * 4. 根据ID查询部门
     * 根据接口文档可知，需要使用@GetMapping注解处理，并补全路径 "/depts/{id}"
     */
    @GetMapping("{id}")
    //public Result<DeptVO> getById(@PathVariable("id") Integer deptId) {
    //4.1 注意：如果形参变量名和路径参数一致，那么("id")可以省略
    public Result<DeptVO> getById(@PathVariable Integer id) {
        //4.2 调用部门业务逻辑层对象deptService，传入部门ID，获取部门数据
        DeptVO deptVO = deptService.getById(id);

        //4.3 封装部门数据，返回给前端
        return Result.success(deptVO);
    }

    /**
     * 5. 修改部门
     * 根据接口文档可知，需要使用@PutMapping注解处理，并补全路径 "/depts"
     * 根据接口文档可知，前端发送的是JSON参数，需要使用@RequestBody注解接收
     */
    @PutMapping("{id}")
    public Result update(@RequestBody DeptDTO dto) {
        //5.1 调用业务逻辑层对象，传入dto（部门的新数据），执行逻辑
        deptService.update(dto);

        //5.2 返回一个默认的成功结果
        return Result.success();
    }
}